<?php

class db
{
	var $linkID   = 0;			//用来保存连接ID
	var $queryID  = 0;			//用来保存查询ID
	var $pconnect  = 0;			//用来保存查询ID
	var $fetchMode= MYSQL_ASSOC;//取记录时的模式
	var $queryNums= 0;			//保存查询的次数
	var $errno    = 0;			//mysql出错代号
	var $error    = "";			//mysql出错信息
	var $record   = array();	//一条记录数组
	var $dsn	  = "";			//数据源


	//======================================
	// 函数: db($host,$user,$pwd,$dbName)
	// 功能: 构造函数,连接数据库
	// 返回: 0:失败
	// 说明: 构造函数将自动连接数据库
	//======================================
	function db(&$dsn)
	{
		if(empty($dsn)) {
			global $configs;
			$this->dsn = $configs;
		} else {
			$this->dsn = $dsn;
		}
		$this->linkID = NULL;
		$this->queryNums = 0;
	}

	//======================================
	// 初始化数据库对象
	//
	// @param array $dsn 实际上是 $configs
	// @param booleam $p_conn
	// @param const $fetch_mode
	// @return object
	//======================================
	function &init(&$dsn) {
		static $db;
		if (is_null($db)) {
			$db = new db($dsn);
		}
		return $db;
	}

	//======================================
	// 函数: connectDB($dsn)
	// 功能: 连接数据库
	// 参数: $host 主机名, $user 用户名
	// 参数:	 $pwd 密码, $dbName 数据库名称
	// 返回: 0:失败
	// 说明: 构造函数将自动连接数据库
	//======================================
	function connectDB()
	{
		if(empty($this->dsn['link'])) {
			$this->dsn['link'] = '';
		}
		$this->linkID = @mysql_connect($this->dsn['dbhost'], $this->dsn['dbuser'], $this->dsn['dbpwd'], $this->dsn['link']);
		if (!$this->linkID)
		{
			$this->halt();
			return 0;
		}
		mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary");
		mysql_query("SET sql_mode=''");
		if (!mysql_select_db($this->dsn['dbname'], $this->linkID))
		{
			$this->halt();
			return 0;
		}
		return $this->linkID;
	}



	//======================================
	// 函数: query($sql)
	// 功能: 数据查询
	// 参数: $sql 要查询的SQL语句
	// 返回: 0:失败
	//======================================
	function query($sql, $type = '', $limit = NULL)
	{

		if (isset($_GET['debug']) && $_GET['debug'] == 'sql') $starttimer = time() + microtime();
		if ($sql && $limit != NULL)
		{
			$sql = $sql . " LIMIT " . $limit;
		}
		if ($this->linkID == null)
		{
			$this->connectDB();
		}

		$this->queryNums++;
		if($type == 'UNBUFFERED')
		{
			$this->queryID = mysql_unbuffered_query($sql, $this->linkID);
		}
		else
		{
			$this->queryID = mysql_query($sql, $this->linkID);
		}
		if (!$this->queryID)
		{
			$this->halt('', $sql);
			return 0;
		}
		if (isset($_GET['debug']) && $_GET['debug'] == 'sql'){
			$stoptimer = time() + microtime();
			$timer = round($stoptimer - $starttimer, 4);
			echo $sql;
			echo '<br>Use: '.$timer;
		}
		return $this->queryID;
	}

	//======================================
	// 函数: fetch_array()
	// 参数：查询的结果 $query
	// 功能: 从结果集中取得一行作为关联数组
	// 返回: false(出错) 或者 关联数组
	//======================================
	function fetch_array($query = '')
	{
		$query = $query ? $query : $this->queryID;
		return mysql_fetch_array($query, $this->fetchMode);
	}

	//======================================
	// 函数: fetchRow()
	// 功能: 从记录集中取出一条记录
	// 返回: 0: 出错 record: 一条记录
	//======================================
	function fetchRow($sql = false)
	{
		if($sql) $this->query($sql);
		$this->record = mysql_fetch_array($this->queryID, $this->fetchMode);
		$this->free_result();
		return $this->record;
	}

	//======================================
	// 函数: fetchAll()
	// 功能: 从记录集中取出所有记录
	// 返回: 记录集数组
	//======================================
	function fetchAll($sql = false, $limit = NULL)
	{
		if($sql)
		{
			$this->query($sql, '', $limit);
		}
		$arr = array();
		while($this->record = mysql_fetch_array($this->queryID,$this->fetchMode))
		{
			$arr[] = $this->record;
		}
		$this->free_result();
		return $arr;
	}

	//======================================
	// 函数: getValue()
	// 功能: 返回记录中指定字段的数据
	// 参数: $field 字段名或字段索引
	// 返回: 指定字段的值
	//======================================
	function getValue($field)
	{
		return $this->record[$field];
	}

	//======================================
	// 函数: affectedRows()
	// 功能: 返回影响的记录数
	//======================================
	function affected_rows()
	{
		return mysql_affected_rows($this->linkID);
	}

	//======================================
	// 函数: recordCount()
	// 功能: 返回查询记录的总数
	// 参数: 无
	// 返回: 记录总数
	//======================================
	function num_rows()
	{
		//$this->queryID
		return mysql_num_rows();
	}

	//======================================
	// 函数: getQueryNums()
	// 功能: 返回查询的次数
	// 参数: 无
	// 返回: 查询的次数
	//======================================
	function getQueryNums()
	{
		return $this->queryNums;
	}

	//======================================
	// 函数: getVersion()
	// 功能: 返回mysql的版本
	// 参数: 无
	//======================================
	function getVersion()
	{
		$this->query("select version() as ver");
		$this->fetchRow();
		return $this->getValue("ver");
	}

	//======================================
	// 函数: result($row)
	// 功能: 返回 MySQL 结果集中一个单元的内容
	// 参数: $row 行
	//======================================
	function result($row)
	{
		return mysql_result($this->queryID, $row);
	}

	//======================================
	// 函数: insert_id()
	// 功能: 返回最后一次插入的自增ID
	// 参数: 无
	//======================================
	function insert_id()
	{
		return mysql_insert_id($this->linkID);
	}

	//======================================
	// 函数: free_result()
	// 功能: 将释放所有与结果标识符 result 所关联的内存
	// 参数: 无
	//======================================
	function free_result()
	{
		return mysql_free_result($this->queryID);
	}

	//选择数据库
	function select_db($dbname)
	{
		return mysql_select_db($dbname, $this->linkID);

	}
	//======================================
	// 函数: close()
	// 功能: 关闭 MySQL 连接
	// 参数: 无
	//======================================
	function close()
	{
		return mysql_close($this->linkID);
	}

	//======================================
	// 函数: halt($message, $sql)
	// 功能: 处理所有出错信息
	// 参数: $message 自定义的出错信息 $sql 语句
	//=====================================
	function halt($message = '', $sql = '')
	{
		//if(empty($_SESSION['aid'])) exit( mysql_errno() );
		exit($message.'<br /><br />'.$sql.'<br /> '.mysql_error());
	}

	function do_update( $tbl, $arr, $where="id=0" )
	{
		$dba = $this->compile_db_update_string( $arr );

		$query = "UPDATE ".$this->obj['sql_prefix'].$tbl." SET $dba";

		if ( $where )
		{
			$query .= " WHERE ".$where;
		}

		$ci = $this->query( $query );

		return $ci;

	}

	function compile_db_update_string($data) {

		$return_string = "";

		foreach ($data as $k => $v)
		{
			$v = preg_replace( "/'/", "\\'", $v );

			//-----------------------------------------
			// Forcing data type?
			//-----------------------------------------

			$return_string .= $k . "='".$v."',";


		}

		$return_string = preg_replace( "/,$/" , "" , $return_string );

		return $return_string;
	}

	function do_insert( $tbl, $arr )
	{
		$dba = $this->compile_db_insert_string( $arr );

		$ci = $this->query("INSERT INTO ".$this->obj['sql_prefix'].$tbl." ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})");

		return $ci;
	}

	function do_replace( $tbl, $arr )
	{
		$dba = $this->compile_db_insert_string( $arr );

		$ci = $this->query("REPLACE INTO ".$this->obj['sql_prefix'].$tbl." ({$dba['FIELD_NAMES']}) VALUES({$dba['FIELD_VALUES']})");

		return $ci;
	}

	function compile_db_insert_string($data) {

		$field_names  = "";
		$field_values = "";

		foreach ($data as $k => $v)
		{

			$v = preg_replace( "/'/", "\\'", $v );

			$field_names  .= "`".$k."`,";

			//-----------------------------------------
			// Forcing data type?
			//-----------------------------------------

				$field_values .= "'$v',";

		}

		$field_names  = preg_replace( "/,$/" , "" , $field_names  );
		$field_values = preg_replace( "/,$/" , "" , $field_values );

		return array( 'FIELD_NAMES'  => $field_names,
		'FIELD_VALUES' => $field_values,
		);
	}
}
?>